
package com.udc.medLine.factory;

import java.util.List;

import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Funcionario;
import com.udc.medLine.exception.CampoDuplicadoException;
import com.udc.medLine.persistence.FuncionarioDAO;

public class FactoryFuncionario {

	private FuncionarioDAO funcionarioDAO;

	/**
	 * 
	 */
	public FactoryFuncionario() {
		super();
		funcionarioDAO = new FuncionarioDAO();
		// TODO Stub de construtor gerado automaticamente
	}

	public Funcionario getFuncionario() {
		return (funcionarioDAO.getFuncionario());
	}

	public void setFuncionario(Funcionario new_funcionario) {
		this.funcionarioDAO.setFuncionario(new_funcionario);
	}

	public void insert() throws Exception {
		int size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.cpf = '"
						+ funcionarioDAO.getFuncionario().getCpf()+"'").size();
		if (size > 0) {
			throw new CampoDuplicadoException("cpf");
		}
		
		size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.matricula = '"
						+ funcionarioDAO.getFuncionario().getMatricula()+"'").size();
		if (size > 0) {
			throw new CampoDuplicadoException("matricula");
		}
		
		size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.usuario = '"
						+ funcionarioDAO.getFuncionario().getUsuario()+"'").size();
		if (size > 0) {
			throw new CampoDuplicadoException("usuario");
		}
		funcionarioDAO.insert();
		
	}

	public void delete() throws Exception {
	   funcionarioDAO.delete();
	}

	public void update() throws Exception {
		int size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.cpf = '"
						+ funcionarioDAO.getFuncionario().getCpf()+"' and funcionario.id != " + funcionarioDAO.getFuncionario().getId()).size();
		if (size > 0) {
			throw new CampoDuplicadoException("cpf");
		}
		
		size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.matricula = '"
						+ funcionarioDAO.getFuncionario().getMatricula()+"'and funcionario.id != " + funcionarioDAO.getFuncionario().getId()).size();
					
		if (size > 0) {
			throw new CampoDuplicadoException("matricula");
		}
		
		size = funcionarioDAO.search(
				"From funcionario in class Funcionario WHERE funcionario.usuario = '"
						+ funcionarioDAO.getFuncionario().getUsuario()+"'and funcionario.id != " + funcionarioDAO.getFuncionario().getId()).size();
		if (size > 0) {
			throw new CampoDuplicadoException("usuario");
		}
		funcionarioDAO.update();
	}

	public List getFuncionario(String campo, String valor){
		List lista;
		try {
			lista = funcionarioDAO.search("From funcionario in class Funcionario WHERE "+campo+" ='"+ valor + "'");
		}
		catch (Exception e){
			return null;
		}
		return lista;
	}
	
	public List getListaFuncionarios(){		
		List lista;	
		try{		
			lista = funcionarioDAO.search("From funcionario in class Funcionario");
		}
		catch (Exception e){
		 	return null;
		}
		return lista;		
	}
	
	public Funcionario obterFuncionario() throws Exception {
		return funcionarioDAO.retrive();
	}

	public List search(CondicaoVO condicao) throws Exception {
		String hql ;
		
		if (condicao.getValor().equals("")){
			hql = "From funcionario in class Funcionario";
		}else {
			hql = "From funcionario in class Funcionario WHERE ";
		if (condicao.getCampo().equals("id")) {
			hql += "id";
			if (condicao.getOperador().equals("contem")) {
				condicao.setOperador("igual");
			}
			
		} else if(condicao.getCampo().equals("usuario")) {
			hql += "usuario";
			condicao.setValor("'" + condicao.getValor() + "'");
		}
		else if(condicao.getCampo().equals("nome")) {
		   hql += "nome";
		}
		if (condicao.getOperador().equals("igual")) {
			hql += "=";
		} else if (condicao.getOperador().equals("diferente")) {
			hql += "!=";
		} else if (condicao.getOperador().equals("maior")) {
			hql += ">";
		} else if (condicao.getOperador().equals("menor")) {
			hql += "<";
		} else if (condicao.getOperador().equals("contem")) {
			hql += " like  ";
			condicao.setValor("('%" + condicao.getValor() + "%')");
		}
		
		}
		hql += condicao.getValor();
		
		return  funcionarioDAO.search(hql);	
	}
}
